Skip to content

Latest commit

 

History

History
239 lines (168 loc) · 8.49 KB

File metadata and controls

239 lines (168 loc) · 8.49 KB

功能描述

  1. 核心功能描述
  2. 常见问题
  3. 技术支持

核心功能描述

功能一:身份管理与身份认证

1.1 抗量子身份生成与验证

系统采用 NIST FIPS 204 ML-DSA-44 (Dilithium) 数字签名算法实现身份认证:

  • 身份生成:基于格密码学的后量子签名密钥对,公钥大小 1312 字节,私钥 2528 字节
  • 身份验证:采用公钥指纹验证机制,有效缩小证书体积,提升验证效率
  • 挑战-响应协议:实现双向认证流程,防止中间人攻击(MITM)
  • 身份存储:通过 PBKDF2HMAC-SHA256 密钥派生,结合 AES-256-GCM 加密本地身份凭证

技术特点

  • 基于模块格上的短整数解(SIS)问题,抗量子计算攻击
  • 签名大小约 2420 字节,安全强度等价于 AES-128
  • 支持确定性与概率性签名生成
  • 本地身份文件加密存储于 data/keys/node_identity.dat

1.2 邀请码机制与网络发现

采用创新的 公钥指纹 + 网络坐标 邀请码机制:

  • 邀请码结构:包含节点 ID、公钥哈希、公网 IP 和端口信息
  • 安全发现:通过 STUN 服务器获取公网坐标,支持 IPv4/IPv6 双栈
  • 身份验证:建立连接前验证 Dilithium 签名,确保节点身份真实性
  • 轻量传输:邀请码体积压缩,便于在多种渠道传输

功能二:抗量子安全通信

2.1 ML-KEM-512 密钥封装机制

通信通道建立采用 NIST FIPS 203 ML-KEM-512 (Kyber) 密钥封装算法:

  • 密钥交换:Kyber512 封装机制,公钥 800 字节,密文 768 字节
  • 前向保密:每次会话生成新的密钥材料,确保历史通信安全
  • 完美前向保密:长期密钥泄露不影响已建立会话的安全性
  • 实现细节:模块格上的学习带误差(MLWE)问题提供量子安全保障

2.2 AES-256-GCM 安全通道

应用层数据传输采用认证加密算法:

  • 加密算法:AES-256-GCM 提供机密性、完整性和认证性
  • 认证标签:128 位认证标签,防止消息篡改
  • 随机 Nonce:96 位 Nonce,确保密文不可预测性
  • 数据分片:大文件分片传输,提高传输可靠性

2.3 可靠 UDP (RUDP) 传输协议

自定义传输层协议实现可靠数据传输:

  • 选择性确认 (SACK):基于 SACK 机制的重传策略,减少冗余数据传输
  • 延迟梯度拥塞控制:Hybrid 混合拥塞控制算法,结合延迟梯度与丢包率
  • 心跳保活:周期性心跳检测,维护连接状态
  • 乱序重组:支持数据包乱序到达与重组

性能指标

  • 支持最大 1400 字节 MTU
  • 拥塞窗口动态调整,适应网络变化
  • 丢包率小于 0.1% 时吞吐量接近 TCP

功能三:分布式秘密共享与数据容灾

3.1 Shamir (t, n) 门限方案

数据容灾基于 Shamir's Secret Sharing 算法:

  • 数学基础:GF(256) 有限域上的多项式插值
  • 门限参数:(t, n) 方案,t 为恢复门限,n 为参与者总数
  • 查表加速:预计算 GF(256) 乘法/加法表,提升性能 10 倍以上
  • 信息论安全:少于 t 个份额无法获取任何明文信息

3.2 分布式备份流程

完整的备份流程包含以下步骤:

  1. 文件加密:首先使用 AES-256-GCM 加密源文件
  2. 秘密分割:将加密后的文件分割为 n 个份额
  3. 份额签名:每个份额使用 Dilithium 私钥签名,确保完整性
  4. 分发存储:通过 P2P 网络将份额分发至已连接节点
  5. 清单生成:生成包含元数据的清单文件,用于恢复

安全特性

  • 每个份额独立加密存储
  • 支持任意大小文件的流式处理
  • 进度实时反馈与断点续传

3.3 多方恢复机制

数据恢复流程实现多方协同:

  1. 清单导入:读取元数据清单,确定所需份额数量
  2. 网络寻呼:向 P2P 网络广播份额请求
  3. 份额验证:验证每个收到份额的 Dilithium 签名
  4. 秘密重构:收集 ≥ t 个有效份额,通过拉格朗日插值重构原始文件
  5. 完整性校验:重构后验证文件哈希值

容错能力

  • 最多可容忍 n - t 个节点失效
  • 支持网络节点动态加入/退出
  • 份额来源不可预测,提升安全性

功能四:本地金库加密

4.1 密码派生与加密机制

本地敏感数据采用金库式加密保护:

  • 密钥派生:PBKDF2HMAC-SHA256,迭代次数 100000+
  • 盐值管理:随机生成 16 字节盐值,存储于 data/keys/.vault_salt
  • 验证机制:派生验证哈希,存储于 data/keys/.vault_verifier
  • 加密模式:AES-256-GCM 认证加密,提供完整性保证

4.2 安全特性

  • 防暴力破解:高迭代次数的密钥派生,显著增加破解难度
  • 防篡改:GCM 模式提供认证标签,数据被篡改可立即检测
  • 零知识验证:密码验证过程不暴露任何密码相关信息
  • 数据隔离:敏感数据与普通数据存储隔离

功能五:P2P 网络与 NAT 穿透

5.1 UDP 打洞技术

实现完整的 NAT 穿透方案:

  • STUN 协议:会话遍历 UDP NAT,获取公网映射地址
  • 打洞流程:双向同时发送探测包,建立 UDP 会话
  • NAT 类型:支持 Full Cone、Restricted Cone、Port Restricted Cone、Symmetric NAT
  • 心跳保活:维持 NAT 端口映射,防止会话超时

5.2 网络架构

  • 去中心化:无中心服务器的P2P 网络架构
  • 动态发现:支持节点动态加入与离开
  • 连接复用:单端口多连接,支持多路复用
  • 状态监控:实时连接状态监控与自动重连

常见问题

Q1: pip 安装依赖时出现 "Fatal error in launcher" 错误?

A: 使用 python -m pip 代替 pip,例如:

python -m pip install -r requirements.txt

如果想永久修复,可以重新安装 pip:

python -m pip install --upgrade --force-reinstall pip

Q2: 忘记本地金库密码怎么办?

A: 很遗憾,本地金库密码无法找回。你需要:

  1. 删除 data/keys/ 目录下的密钥文件
  2. 删除 data/shares/ 目录下的份额文件
  3. 重新启动应用,设置新密码
  4. ⚠️ 注意:之前本地存储的数据将无法恢复

Q3: 连接其他节点失败?

A: 请检查:

  1. 对方节点是否在线
  2. 邀请码是否正确(完整复制,不要有多余空格)
  3. 网络是否允许 UDP 通信(某些防火墙可能阻止)
  4. 双方是否都在同一版本的系统上

Q4: 恢复时收集不到足够的份额?

A: 可能原因:

  1. 存储份额的节点不在线
  2. 网络连接问题
  3. 检查清单文件是否正确
  4. 尝试等待更长时间,或联系更多节点上线

Q5: 支持哪些文件类型?

A: 系统支持任何类型的文件:

  • 文档(.docx, .pdf, .txt 等)
  • 图片(.jpg, .png, .gif 等)
  • 视频和音频文件
  • 压缩包(.zip, .rar 等)
  • 任意二进制文件

文件大小建议:虽然系统支持大文件,但建议单个文件不超过 1GB 以获得最佳性能。

Q6: 如何确保安全性?

A: 系统通过多层加密保护:

  1. 传输层:Kyber 密钥交换 + AES-256-GCM 加密
  2. 身份认证:Dilithium 数字签名
  3. 存储层:本地金库 AES-256-GCM 加密
  4. 容灾层:Shamir 秘密共享,即使部分节点丢失也能恢复

Q7: 可以在多台设备上使用同一身份吗?

A: 不建议。每个节点应该有独立的身份:

  • 身份文件存储在 data/keys/node_identity.dat(AES-256-GCM 加密)
  • 如果需要在多台设备使用,可以复制此文件(但存在安全风险)
  • 更好的方式是让每台设备生成独立身份,然后互相连接

Q8: 不同客户机UDP连接不能实现的问题怎么解决

A:先尝试在控制面板中添加入站规则

  • 按 Win + R ,输入 wf.msc
  • 按 Enter
  • 点击左侧 "入站规则"
  • 点击右侧 "新建规则..."
  • 选择 "端口" -> "下一步"
  • 选择 "UDP" ,输入 "9999" -> "下一步"
  • 选择 "允许连接" -> "下一步"
  • 保持所有选项勾选 -> "下一步"
  • 输入名称: "QSP-P2P"
  • 点击 "完成"

技术支持

如遇到其他问题,请检查:

  1. Python 版本是否符合要求
  2. 所有依赖是否正确安装
  3. 网络连接是否正常
  4. 防火墙设置是否允许 UDP 通信